/**
 * //给定两个整型数字 N 与 M，以及表示比特位置的 i 与 j（i <= j，且从 0 位开始计算）。
 * //
 * // 编写一种方法，使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域，不足之处用 0 补齐。具体插入过程如图所示。
 * //
 * //
 * //
 * // 题目保证从 i 位到 j 位足以容纳 M， 例如： M = 10011，则 i～j 区域至少可容纳 5 位。
 * //
 * //
 * //
 * // 示例1:
 * //
 * //
 * // 输入：N = 1024(10000000000), M = 19(10011), i = 2, j = 6
 * // 输出：N = 1100(10001001100)
 * //
 * //
 * // 示例2:
 * //
 * //
 * // 输入： N = 0, M = 31(11111), i = 0, j = 4
 * // 输出：N = 31(11111)
 * //
 * //
 * // Related Topics 位运算 👍 59 👎 0
 */

package com.xixi.basicAlgroithms.bitManipulation;

public class ID_interview_05_01_InsertIntoBitsLcci {
    public static void main(String[] args) {
        Solution solution = new ID_interview_05_01_InsertIntoBitsLcci().new Solution();
    }


    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int insertBits(int N, int M, int i, int j) {


            int Nindex = 0;
            int resSum = 0;
            while (Nindex < i) {
                int NBit = N >>> Nindex;
                NBit = (NBit & 1) << Nindex;
                resSum += NBit;
                Nindex++;
            }


            //插入M
            int Mindex = 0;
            while (Nindex <= j) {
                int MBit = M >>> Mindex;
                MBit = (MBit & 1) << Nindex;
                resSum += MBit;
                Mindex++;
                Nindex++;
            }

            while (Nindex < 32) {
                int NBit = N >>> Nindex;
                NBit = (NBit & 1) << Nindex;
                resSum += NBit;
                Nindex++;
            }

            return resSum;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)


}